package pe.gob.osce.sirenas.wd.jsf.bean.administracion;

import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

import org.primefaces.context.RequestContext;

import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.BusquedaFichaDTO;
import pe.gob.osce.sirenas.model.BusquedaFiscalizacionDTO;
import pe.gob.osce.sirenas.model.DocenciaDTO;
import pe.gob.osce.sirenas.model.EspecialidadAcademicaDTO;
import pe.gob.osce.sirenas.model.ExperienciaLaboralDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.FormacionAcademicaDTO;
import pe.gob.osce.sirenas.model.TrayectoriaArbitralDTO;
import pe.gob.osce.sirenas.model.reporte.DataReporteDTO;
import pe.gob.osce.sirenas.model.reporte.FiltroReporteDTO;
import pe.gob.osce.sirenas.svc.BusquedaFichaArbitralAdminServiceLocal;
import pe.gob.osce.sirenas.svc.ObtenerReportesServiceLocal;
import pe.gob.osce.sirenas.svc.RegistrarFichaArbitroServiceLocal;
import pe.gob.osce.sirenas.svc.RegistrarFiscalizacionServiceLocal;
import pe.gob.osce.sirenas.util.ModeloException;
import pe.gob.osce.sirenas.wd.util.ConstanteWeb;
import pe.gob.osce.sirenas.wd.util.RepositorioDatos;
import pe.gob.osce.sirenas.wd.util.UBaseManage;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteConsolidadoDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstCapacitacionDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstDocenciaDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstEspecialidadAcademicaDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstExpLaboralDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstFormacionAcademicaDS;
import pe.gob.osce.sirenas.wd.util.reporte.ReporteLstTrayectoriaArbitralDS;

@ManagedBean(name="bandejaReporteBean")
@SessionScoped
public class BandejaReporteBean extends UBaseManage implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@EJB
	private ObtenerReportesServiceLocal obtenerReportesService;
	
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteWeb.PROPERTIES);

	
	private FiltroReporteDTO filtrosDTO;
	

	private RepositorioDatos repositorioDatos;
	private AuditoriaDTO auditoria;
	private FichaArbitralDTO fichaArbitral;
    private RequestContext context; 
    
    List<DataReporteDTO> lstDataReporteConsolidado;

	public String verBandejaReporte() {
		this.filtrosDTO=new FiltroReporteDTO();
		this.repositorioDatos=obtenerRepositorioDatos();
		this.auditoria=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
		this.fichaArbitral=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		
		return "verBandejaReporte";
	}
	
	public void buscarDataReporte(){
		try {	
			
			this.lstDataReporteConsolidado=obtenerReportesService.obtenerReporteConsolidado(this.filtrosDTO);
			for (DataReporteDTO dataReporteDTO : lstDataReporteConsolidado) {
				if(dataReporteDTO.getIndModalidadArbitro()!=null && dataReporteDTO.getIndModalidadArbitro()>0)
					dataReporteDTO.setModalidadArbitro(repositorioDatos.getLabelModalidadArbitraje(dataReporteDTO.getIndModalidadArbitro().longValue() ));
				if(dataReporteDTO.getIndTipoDocumento()!=null && dataReporteDTO.getIndTipoDocumento()>0)
					dataReporteDTO.setTipoDocumento(repositorioDatos.getLabelDocumentoID(dataReporteDTO.getIndTipoDocumento().longValue()));
			}

		} catch (ModeloException e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
		}catch (Exception e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));
		}	
	}

	public void generaReporteConsolidado(){
		this.fichaArbitral=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		if(this.lstDataReporteConsolidado.size()!=0){
			try {		
				JasperPrint jasperSolicitud = new JasperPrint();
				jasperSolicitud=generaFichaPdf(jasperSolicitud,fichaArbitral);
				guardoReporteServidor(propSirenas.getString(ConstanteWeb.FS_REPORTES),"ReporteConsolidado",jasperSolicitud);
				abrirVisorReportePopup();
				
			} catch (ModeloException e) {
				setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
			}catch (Exception e) {
				setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));
			}
		}else{
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_NO_DATA));
		}
	}

	public void abrirVisorReportePopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogVisorReporte').show();");
	}
	
	public JasperPrint generaFichaPdf(JasperPrint jasperSolicitud,FichaArbitralDTO fichaArbitral)  throws ModeloException{
		RepositorioDatos repositorioDatos=obtenerRepositorioDatos();
		this.auditoria=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
		
		try {
			//List<DataReporteDTO> lstFormacionAcademica=obtenerReportesService.obtenerReporteConsolidado(this.filtrosDTO);
			ReporteConsolidadoDS reporteConsolidadoDS = new ReporteConsolidadoDS(this.lstDataReporteConsolidado);
			
			String rutaImagenLogo = "/recursos/imagenes/Sello_OSCE_Horizontal.jpg";
			InputStream imgLogoSt = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(rutaImagenLogo);

			SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/M/yyyy hh:mm"); 
			HashMap parametros = new HashMap();
			parametros.put("P_IMAGEN_LOGO", imgLogoSt);
			

			parametros.put("P_USUARIO",auditoria.getUsuarioRegistro() );
			parametros.put("P_FECHA",formatoFecha.format(new Date()));
			
			JasperReport report = JasperCompileManager.compileReport(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/reporte/jasper/rptConsolidado.jrxml"));

			jasperSolicitud = JasperFillManager.fillReport(report,parametros,reporteConsolidadoDS);			
		
		} catch (Exception e) {
			throw new ModeloException("Error al Generar la Ficha en PDF",e);
		}
		return jasperSolicitud;
	}
	
	/**
	 * Metodo que permite obtener filtrosDTO.
	 * @return filtrosDTO , tipo FiltroReporteDTO.
	 */
	public FiltroReporteDTO getFiltrosDTO() {
		return filtrosDTO;
	}

	/**
	 * Permite actualizar filtrosDTO.
	 * @param filtrosDTO, tipo FiltroReporteDTO.
	 */
	public void setFiltrosDTO(FiltroReporteDTO filtrosDTO) {
		this.filtrosDTO = filtrosDTO;
	}

	/**
	 * Metodo que permite obtener lstDataReporteConsolidado.
	 * @return lstDataReporteConsolidado , tipo List<DataReporteDTO>.
	 */
	public List<DataReporteDTO> getLstDataReporteConsolidado() {
		return lstDataReporteConsolidado;
	}

	/**
	 * Permite actualizar lstDataReporteConsolidado.
	 * @param lstDataReporteConsolidado, tipo List<DataReporteDTO>.
	 */
	public void setLstDataReporteConsolidado(
			List<DataReporteDTO> lstDataReporteConsolidado) {
		this.lstDataReporteConsolidado = lstDataReporteConsolidado;
	}
	
}
